package com.shujia.mr.combineFile;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class WordCount {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        // 在Main函数中对当前的MapReduce进行做配置工作

        // 1.需要创建一个整体的对象job => MapReduce

        Configuration conf = new Configuration();
//        conf.setLong("mapreduce.input.fileinputformat.split.maxsize",5 * 1024 * 1024L);

        Job job = new Job(conf);
        job.setJobName("idea-CombineCount");
        job.setJarByClass(WordCount.class);

        // 2.告诉Job对应的Map和Reduce具体使用哪个类
        job.setMapperClass(WordCountMapper.class); // Class<? extends Mapper
        job.setReducerClass(WordCountReducer.class);

        // 3.告诉Job Map端输出的数据类型 和 Reduce端输出的数据类型(最终输出数据类型)
        // java.lang.ClassCastException: interface javax.xml.soap.Text 类型转换错误
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        job.setInputFormatClass(CombineTextInputFormat.class); // 问题
        CombineFileInputFormat.setMaxInputSplitSize(job,5 * 1024 * 1024L);

        // 4.需要告诉MapReduce数据所在位置  输入数据位置  输出数据位置
        //   路径选择时需要注意：如果在IDEA中执行，那么路径是读取当前本地路径
//                              如果是在Hadoop集群中执行，那么需要设置HDFS中的路径
        FileInputFormat.addInputPath(job,new Path("hadoopCode/data/mapreduce/word"));
        FileOutputFormat.setOutputPath(job,new Path("hadoopCode/output/combineFile"));

//        FileInputFormat.addInputPath(job,new Path("/input"));
//        FileOutputFormat.setOutputPath(job,new Path("/mapreduce/output"));

        // 5.做代码提交
        //  在本地IDEA中执行，需要有Hadoop环境，并且能获取到winUtils
        //  Process finished with exit code 0  退出代码为0 并不代表当前任务执行成功
        job.waitForCompletion(true);

    }
}
